import random

from game import Person, bcolors
from inventory import Item
from magic import Spell

print("\n\n")
# Create Black Magic
fire = Spell("Fire", 25, 600, "black")
light = Spell("Light", 25, 600, "black")
water = Spell("Water", 25, 600, "black")
shadow = Spell("Shadow", 25, 600, "black")

# Create White Magic
cure = Spell("Cure", 25, 620, "white")
cure2 = Spell("Cure II", 32, 1500, "white")
cure3 = Spell("Cure III", 50, 6000, "white")


# Create some Items
potion = Item("Potion", "potion", "Heals 50 HP", 50)
hipotion = Item("Hi-Potion", "potion", "Heals 100 HP", 100)
superpotion = Item("Super Potion", "potion", "Heals 1000 HP", 1000)
elixir = Item("Elixir", "elixir",
              "Fully restores HP/MP of one party members", 9999)
hielixir = Item("Megaelixir", "elixir", "Fully restores party's HP/MP", 9999)

grenade = Item("Grenade", "attack", "Deals 500 damage", 500)

player_spells = [fire, light, water, cure, cure2]
enemy_spells = [shadow, light, fire, cure3]
player_items = [{"item": potion, "quantity": 15}, {"item": hipotion, "quantity": 5},
                {"item": superpotion, "quantity": 5}, {
                    "item": elixir, "quantity": 5},
                {"item": hielixir, "quantity": 2}, {"item": grenade, "quantity": 5}]

# Instantiate People
player1 = Person("Crono", 3260, 132, 300, 34, player_spells, player_items)
player2 = Person("Ayla ", 4160, 138, 311, 34, player_spells, player_items)
player3 = Person("Frog ", 3089, 174, 288, 34, player_spells, player_items)

enemy1 = Person("Flea   ", 1250, 130, 560, 325, enemy_spells, [])
enemy2 = Person("Ozzie  ", 18200, 701, 525, 25, enemy_spells, [])
enemy3 = Person("Slash  ", 1250, 130, 560, 325, enemy_spells, [])

players = [player1, player2, player3]
enemies = [enemy1, enemy2, enemy3]

defeated_enemies = 0
defeated_players = 0

running = True
i = 0

print(bcolors.FAIL + bcolors.BOLD + "AN ENEMY ATTACKS!" + bcolors.ENDC)

while running:
    try:
        print("==============================")
        print("\n")

        print("NAME                     HP                                       MP")
        for player in players:
            player.get_stats()

        print("\n")

        for enemy in enemies:
            enemy.get_enemy_stats()

        for player in players:
            player.print_action()
            choice = input("    Choose action\n    >>> ")
            index = int(choice) - 1

            if index == 0:
                dmg = player.generate_damage()
                enemy = player.print_target(enemies)

                enemies[enemy].take_damage(dmg)
                print("\n" + "You attacked " + enemies[enemy].name.replace(
                    "  ", "") + " for", dmg, "points of damage.")

                if enemies[enemy].get_hp() == 0:
                    print(enemies[enemy].name.replace("  ", "") + " has died.")
                    del enemies[enemy]

            elif index == 1:
                player.print_magic()
                magic_choice = int(input("    Choose magic: ")) - 1

                if magic_choice == -1:
                    continue

                spell = player.magic[magic_choice]
                magic_dmg = spell.generate_damage()

                current_mp = player.get_mp()

                if spell.cost > current_mp:
                    print(bcolors.FAIL + "\nNot enough MP\n" + bcolors.ENDC)
                    continue

                player.reduce_mp(spell.cost)

                if spell.type == "white":
                    player.heal(magic_dmg)
                    print(bcolors.OKBLUE + "\n" + spell.name +
                          " heals for", str(magic_dmg), "HP." + bcolors.ENDC)
                elif spell.type == "black":

                    enemy = player.print_target(enemies)

                    enemies[enemy].take_damage(magic_dmg)

                    print(bcolors.OKBLUE + "\n" + spell.name + " deals", str(magic_dmg),
                          "points of damage to " + enemies[enemy].name.replace("  ", "") + bcolors.ENDC)

                    if enemies[enemy].get_hp() == 0:
                        print(enemies[enemy].name + " has died.")
                        del enemies[enemy]
                        defeated_enemies += 1

            elif index == 2:
                player.print_item()
                item_choice = int(input("    Choose item: ")) - 1

                if item_choice == -1:
                    continue

                item = player.items[item_choice]["item"]

                if player.items[item_choice]["quantity"] == 0:
                    print(bcolors.FAIL + "\n" + "None left..." + bcolors.ENDC)
                    continue

                player.items[item_choice]["quantity"] -= 1

                if item.type == "potion":
                    player.heal(item.prop)
                    print(bcolors.OKGREEN + "\n" + item.name +
                          " heals for", str(item.prop), "HP", bcolors.ENDC)
                elif item.type == "elixir":

                    if item.name == "Megaelixir":
                        for i in players:
                            i.hp = i.maxhp
                            i.mp = i.maxmp
                    else:
                        player.hp = player.maxhp
                        player.mp = player.maxmp
                    print(bcolors.OKGREEN + "\n" + item.name +
                          " fully restores HP/MP" + bcolors.ENDC)
                elif item.type == "attack":

                    enemy = player.print_target(enemies)

                    enemies[enemy].take_damage(item.prop)

                    print(bcolors.FAIL + "\n" + item.name + " deals", str(item.prop),
                          " points of damage to " + enemies[enemy].name.replace("  ", "") + "." + bcolors.ENDC)

    except ValueError:
        continue

    except IndexError:
        continue

    except NameError:
        continue

    if enemies[enemy].get_hp() < 1:
        print(enemies[enemy].name.replace("  ", "") + " has died.")
        del enemies[enemy]

    for player in players:
        if player.get_hp() < 1:
            defeated_players += 1

    for enemy in enemies:
        if enemy.get_hp() < 1:
            defeated_enemies += 1

    # Check if Player won
    if defeated_enemies == 3:
        print(bcolors.OKGREEN + "You win!" + bcolors.ENDC)
        running = False

    print("\n")
    # Enemy attack phase
    for enemy in enemies:
        enemy_choice = random.randrange(0, 2)

        if enemy_choice == 0:
            target = random.randrange(0, len(players))
            enemy_dmg = enemy.generate_damage()

            players[target].take_damage(enemy_dmg)
            print(enemy.name.replace("  ", "") + " attacks " +
                  players[target].name.replace(" ", "") + " for", str(enemy_dmg) + ".")

        elif enemy_choice == 1:
            spell, magic_dmg = enemy.choose_enemy_spell()
            enemy.reduce_mp(spell.cost)

            if spell.type == "white":
                enemy.heal(magic_dmg)
                print(bcolors.OKBLUE + spell.name + " heals " + enemy.name.replace("  ",
                                                                                   "") + " for", str(magic_dmg), "HP." + bcolors.ENDC)
            elif spell.type == "black":

                target = random.randrange(0, len(players))

                players[target].take_damage(magic_dmg)

                print(bcolors.OKBLUE + "\n" + enemy.name.replace(" ", "") + "'s " + spell.name + " deals", str(magic_dmg),
                      "points of damage to " + players[target].name.replace("  ", "") + bcolors.ENDC)

                if players[target].get_hp() == 0:
                    print(players[target].name.replace(
                        "  ", "") + " has died.")
                    del players[target]
                    defeated_players += 1

            # print("Enemy chose", spell, "damage is", magic_dmg)

    # Check if Enemy won
    if defeated_players == 3:
        print(bcolors.FAIL + "Your enemies have defeated you!" + bcolors.ENDC)
        running = False
        break

    print("\n")
